// 1. 引入必要的模块
const express = require('express');
const multer = require('multer');
const { GoogleGenerativeAI } = require("@google/generative-ai");
const cors = require('cors');

// --- 配置区域 ---

// 2. 初始化 Express 应用
const app = express();
const port = process.env.PORT || 9000; // 使用环境变量或默认9000端口

// 3. 配置中间件
app.use(cors()); // 允许跨域请求，方便本地开发测试
app.use(express.json({ limit: '50mb' })); // 支持解析JSON格式的请求体
app.use(express.urlencoded({ extended: true, limit: '50mb' })); // 支持解析URL编码的请求体

// 4. 配置 Google GenAI
// 重要：将您的API密钥设置为环境变量，不要硬编码在代码里！
// 在腾讯云服务器上运行前，执行: export GOOGLE_API_KEY="YOUR_GEMINI_API_KEY"
// if (!process.env.GOOGLE_API_KEY) {
//   console.error("致命错误：请先设置 GOOGLE_API_KEY 环境变量。");
//   process.exit(1); // 如果没有API Key，直接退出程序
// }
GOOGLE_API_KEY='xxxx'
const genAI = new GoogleGenerativeAI(GOOGLE_API_KEY);
const model = genAI.getGenerativeModel({ model: "gemini-2.5-flash-image-preview" }); // 推荐使用最新的Flash模型

// 5. 配置 Multer 用于处理文件上传
// 我们将文件存储在内存中，直接传递给Google API，不写入服务器硬盘
const storage = multer.memoryStorage();
const upload = multer({
  storage: storage,
  limits: {
    fileSize: 10 * 1024 * 1024 // 限制文件大小为 10MB
  }
});

// --- API 路由区域 ---

/**
 * @route POST /api/generate-image-from-image
 * @description 接收用户上传的图片，调用Google GenAI生成新图片并返回。
 * @param {file} userImage - 用户上传的图片文件。
 * @param {string} prompt - [可选] 附带的提示词。
 */
app.post('/api/generate-image-from-image', upload.single('userImage'), async (req, res) => {
  console.log(`[${new Date().toISOString()}] 收到图片生成请求...`);

  // 检查1：是否上传了文件
  if (!req.file) {
    console.log("请求失败：没有找到上传的图片文件。");
    return res.status(400).json({ error: "请求失败，请确保上传了名为 'userImage' 的图片。" });
  }

  // 准备发送给 Google API 的数据
  const userImagePart = {
    inlineData: {
      data: req.file.buffer.toString("base64"), // 从内存中读取文件Buffer并转为Base64
      mimeType: req.file.mimetype, // 使用 multer 自动识别的 mimeType
    },
  };

  // 获取提示词 (可以从小程序端通过表单数据传来)
  const prompt = `create a 1/7 scale commercialized figurine of the characters in the picture, in a realistic style, in a real environment. The figurine is placed on a computer desk. The figurine has a round transparent acrylic base, with no text on the base. The content on the computer screen is the Zbrush modeling process of this figurine. Next to the computer screen is a BANDAI-style toy packaging box printed with the original artwork. The packaging features two-dimensional flat illustrations.`;
  console.log(`使用的MIME类型: ${req.file.mimetype}`);
  console.log(`使用的提示词: "${prompt}"`);

  try {
    console.log("正在调用 Google GenAI API...");
    const result = await model.generateContent([prompt, userImagePart]);
    const response = result.response;

    // 检查模型是否有返回内容
    if (!response.candidates || response.candidates.length === 0 || !response.candidates[0].content) {
      const feedbackText = response.promptFeedback?.blockReason?.message || response.text() || "未知原因";
      console.error("错误：模型因安全策略或其他原因拒绝生成图片。", feedbackText);
      return res.status(502).json({ error: `模型未能生成有效图片，原因: ${feedbackText}` });
    }

    let imageGenerated = false;
    // 遍历返回的所有部分，寻找图像数据
    for (const part of response.candidates[0].content.parts) {
      if (part.inlineData && part.inlineData.data) {
        console.log("成功从Google API获取到生成的图片！");
        const generatedImageData = part.inlineData.data; // base64 编码的字符串
        const generatedMimeType = part.inlineData.mimeType;

        // 将生成的图片数据直接返回给小程序前端
        res.status(200).json({
          success: true,
          message: "图片生成成功",
          imageData: {
            mimeType: generatedMimeType,
            base64: generatedImageData,
          }
        });

        imageGenerated = true;
        break; // 找到一张图片就够了
      }
    }

    if (!imageGenerated) {
      console.error("错误：模型的响应中找到了候选内容，但其中不包含图像数据。");
      res.status(502).json({ error: "模型响应异常，未返回图像数据。", details: response.text() });
    }

  } catch (error) {
    console.error("调用 Google AI 时发生严重错误:", error);
    res.status(500).json({ error: "服务器在请求Google AI时遇到内部错误。", details: error.message });
  }
});


// --- 启动服务器 ---

// 统一的错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('服务器发生了一些问题!');
});

app.listen(port, () => {
  console.log(`✅ 服务器成功启动，正在监听端口: http://localhost:${port}`);
});